package br.edu.ufc.deti.broker.mapeamento;

import java.io.IOException;

import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.ClassDescriptorResolver;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.ValidationException;

import br.edu.ufc.deti.beans.PerfClusters;
import br.edu.ufc.deti.broker.mapeamento.bean.PerfClustersDecorator;
import br.edu.ufc.deti.broker.mapeamento.castor.utils.CastorUtil;

public class ExecucaoMapping {
	private static ExecucaoMapping instance;
	/**
	 * Array que armazena os arquivos de mapeamento do perfCluster.
	 */
	private static final String[] MAPEAMENTO_EXECUCAO_PERFCLUSTERS = {
		"/br/edu/ufc/deti/broker/mapeamento/resources/xml/Execucao.xml",
		"/br/edu/ufc/deti/broker/mapeamento/resources/xml/Recurso.xml",
		"/br/edu/ufc/deti/broker/mapeamento/resources/xml/Requisito.xml"};
	/**
	 * Variável que armazena o mapeamento do PerfCluster.
	 */
	private static ClassDescriptorResolver cdResolverPerfCluster;	
	/**
	 * 	Método construtor default que teve sua visibilidade reduzida a fim de implementar o Singleton.
	 * @throws IOException.
	 * @throws MappingException.
	 */
	private ExecucaoMapping() throws IOException, MappingException {
		cdResolverPerfCluster = CastorUtil.getClassDescriptorResolver( MAPEAMENTO_EXECUCAO_PERFCLUSTERS );
	}
	
	public static synchronized ExecucaoMapping getInstance() throws IOException, MappingException {
		if( instance == null )
			instance = new ExecucaoMapping();
		return instance;
	}	
	/**
	 * Método responsável por converter uma string no formato de um xml do perfCluster.
	 * @param xmlPerfCluster String no formato xml que será convertido num objeto perfcluster.
	 * @return Objeto do perfclusters cujos atributos contém as informações do xml
	 * de acordo com o mapeamento definido.
	 * @throws ValidationException 
	 * @throws IOException.
	 * @throws MarshalException.
	 * @throws ValidationException.
	 */
	public PerfClusters unmarshalPerfClusters( String xmlPerfClusters, PerfClustersDecorator perfClustersDecorator ) throws IOException, MarshalException, ValidationException {
		CastorUtil castorUtil = new CastorUtil();
		if( perfClustersDecorator == null )
			perfClustersDecorator = new PerfClustersDecorator();
		perfClustersDecorator = ( PerfClustersDecorator ) castorUtil.unmarshal( cdResolverPerfCluster, perfClustersDecorator, xmlPerfClusters );
		return perfClustersDecorator.getPerfClusters();
	}
	/**
	 * Método responsável por converter uma string no formato de um xml do perfCluster.
	 * @param xmlPerfCluster String no formato xml que será convertido num objeto perfcluster.
	 * @return Objeto do perfclusters cujos atributos contém as informações do xml
	 * de acordo com o mapeamento definido.
	 * @throws ValidationException 
	 * @throws IOException.
	 * @throws MarshalException.
	 * @throws ValidationException.
	 */
	public String marshalPerfClusters( PerfClustersDecorator perfClustersDecorator ) throws IOException, MarshalException, ValidationException {
		CastorUtil castorUtil = new CastorUtil();
		if( perfClustersDecorator == null )
			perfClustersDecorator = new PerfClustersDecorator();
		String perfClustersDecoratorRetorno = ( String ) castorUtil.marshal( cdResolverPerfCluster, perfClustersDecorator );
		return perfClustersDecoratorRetorno;
	}
}
